"""
总结如下重点知识
1. 说说你对面向对象编程的理解？

2. 说说迭代器和生成器的区别？
#  1.迭代器类型必须实现__iter__和 __next__（Python2中是next)
#  2. __iter__方法必须 返回 self
#  3. __next__必须返回下一个值，如果没有下一个则抛出StopIteration异常
#  4. 对迭代器进行for操作时，每次操作都会执行__next__方法
#  5. 只能迭代一遍。
#  6. for语句的迭代，会忽略StopIteration异常
#  7. 迭代器 与 list相比，迭代器省内存
# 生成器的意义： 为了快速方便地创建一个迭代器，所以生成器一定是一个迭代器
# yield的关键字，来实现快速创建迭代器

3. 什么是回调函数？
# 回调函数：（回调模式）如果一个函数的参数是函数类型，那么我们可以把这个参数叫做回调函数


4. 什么是闭包？
日志模块，就是闭包模式，不影响其他函数的情况下，调用后能够处理的方法返回函数本身


5. 说说装饰器的原理？
1.装饰器的实现是由闭包支撑的
2.装饰器本质上是⼀个python函数，它可以在让其他函数在不需    要做任何代码的变动的前提下增加额外的功能；
3.装饰器的返回值也是⼀个函数的对象
作用：
1. 用装饰器写的代码优雅
2. 在不更改函数的基础上，为函数添加额外的功能

6. 什么是单例模式？
这种模式涉及到一个单一的类，该类负责创建自己的对象，同时确保只有单个对象被创建。
这个类提供了一种访问其唯一的对象的方式，可以直接访问，不需要实例化该类的对象。
注意：
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。

7. 进程、线程和协程的区别是什么？
一、进程
进程是程序一次动态执行的过程，是程序运行的基本单位。
每个进程都有自己的独立内存空间，不同进程通过进程间通信来通信。
进程占据独立的内存，所以上下文进程间的切换开销（栈、寄存器、页表、文件句柄等）比较大，但相对比较稳定安全。协程切换和协程切换
总结：保存在硬盘上的程序运行以后，会在内存空间里形成一个独立的内存体，这个内存体有自己独立的地址空间，有自己的堆，上级挂靠单位是操作系统。操作系统会以进程为单位，分配系统资源（CPU时间片、内存等资源），进程是资源分配的最小单位。

二、线程
线程又叫做轻量级进程，是CPU调度的最小单位。
线程从属于进程，是程序的实际执行者。一个进程至少包含一个主线程，也可以有更多的子线程。
多个线程共享所属进程的资源，同时线程也拥有自己的专属资源。
程间通信主要通过共享内存，上下文切换很快，资源开销较少，但相比进程不够稳定容易丢失数据。
总结：线程从属于进程，是程序的实际执行者。一个进程可以有多个线程，最少有一个线程，但一个线程只能有一个进程。

三、协程
协程是一种用户态的轻量级线程，协程的调度完全由用户控制。
一个线程可以拥有多个协程，协程不是被操作系统内核所管理，而完全是由程序所控制。
与其让操作系统调度，不如我自己来，这就是协程
总结：协程最主要的作用是在单线程的条件下实现并发的效果，但实际上还是串行的(像yield一样)一个线程可以拥有多个协程，协程不是被操作系统内核所管理，而完全是由程序所控制。

四、进程多与线程区别
线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别:
1、根本区别： 进程是操作系统资源分配和独立运行的最小单位；线程是任务调度和系统执行的最小单位。
2、地址空间区别： 每个进程都有独立的地址空间，一个进程崩溃不影响其它进程；一个进程中的多个线程共享该 进程的地址空间，一个线程的非法操作会使整个进程崩溃。
3、上下文切换开销区别： 每个进程有独立的代码和数据空间，进程之间上下文切换开销较大；线程组共享代码和数据空间，线程之间切换的开销较小。

五、协程与线程进行区别
1) 一个线程可以多个协程，一个进程也可以单独拥有多个协程。
2) 线程进程都是同步机制，而协程则是异步。
3) 协程能保留上一次调用时的状态，每次过程重入时，就相当于进入上一次调用的状态。
4）线程是抢占式，而协程是非抢占式的，所以需要用户自己释放使用权来切换到其他协程，因此同一时间其实只有一个协程拥有运行权，相当于单线程的能力。
5）协程并不是取代线程, 而且抽象于线程之上, 线程是被分割的CPU资源, 协程是组织好的代码流程, 协程需要线程来承载运行, 线程是协程的资源, 但协程不会直接使用线程, 协程直接利用的是执行器(Interceptor), 执行器可以关联任意线程或线程池, 可以使当前线程, UI线程, 或新建新程.。
6）线程是协程的资源。协程通过Interceptor来间接使用线程这个资源。
注：协程看上去也是子程序，但执行过程中，在子程序内部可中断，然后转而执行别的子程序，在适当的时候再返回来接着执行。
协程，在执行过程中可中断去执行其他任务，执行完毕后再回来继续原先的操作——可以理解为两个或多个程序协同工作。

六、进程、线程、协程的对比
协程既不是进程也不是线程，协程仅仅是一个特殊的函数，协程与进程和线程不是一个维度的。
一个进程可以包含多个线程，一个线程可以包含多个协程。
一个线程内的多个协程虽然可以切换，但是多个协程是串行执行的，只能在一个线程内运行，没法利用CPU多核能力。

协程与进程一样，切换是存在上下文切换问题的。
切换：协程的切换是用户控制的

8. 栈和队列的区别
队列和栈是两种不同的数据结构。它们有以下区别：
（1）操作的名称不同。队列的插入称为入队，队列的删除称为出队。栈的插入称为进栈，栈的删除称为出栈。
（2）可操作的方式不同。队列是在队尾入队，队头出队，即两边都可操作。而栈的进栈和出栈都是在栈顶进行的，无法对栈底直接进行操作。
（3）操作的方法不同。队列是先进先出（FIFO），即队列的修改是依先进先出的原则进行的。新来的成员总是加入队尾（不能从中间插入），每次离开的成员总是队列头上（不允许中途离队）。而栈为后进先出（LIFO）,即每次删除（出栈）的总是当前栈中最新的元素，即最后插入（进栈）的元素，而最先插入的被放在栈的底部，要到最后才能删除。

9. super
在Python2中，如果定义类的方式是 class MyClass:   那么该类叫做经典类，如果定义类的方式为class MyClass(object): 那么该类为新式类。在Python3中，上面两种方式定义出来的类都叫新式类。本文是基于新式类来进行讲解的。

Python 中的 super() 是用于调用父类（或父类的父类...）方法的 函数，主要用于多继承，单继承问题不大。
"""
